WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํํ ์ฑ๋ฅ์ ๊ตฌํํ์ธ์. ์ด ๊ฐ์ด๋๋ ๋ค์ํ ํ๋ซํผ์์ ํจ๊ณผ์ ์ธ GPU-CPU ๋๊ธฐํ๋ฅผ ์ํ ํต์ฌ ์์์ธ WebGL Sync Fence๋ฅผ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃน๋๋ค.
GPU-CPU ๋๊ธฐํ ๋ง์คํฐํ๊ธฐ: WebGL Sync Fence ์ฌ์ธต ๋ถ์
๊ณ ์ฑ๋ฅ ์น ๊ทธ๋ํฝ ๋ถ์ผ์์ ์ค์ ์ฒ๋ฆฌ ์ฅ์น(CPU)์ ๊ทธ๋ํฝ ์ฒ๋ฆฌ ์ฅ์น(GPU) ๊ฐ์ ํจ์จ์ ์ธ ํต์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. WebGL์ ํ๋ฌ๊ทธ์ธ ์์ด ํธํ๋๋ ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ๋ด์์ ๋ํํ 2D ๋ฐ 3D ๊ทธ๋ํฝ์ ๋ ๋๋งํ๊ธฐ ์ํ JavaScript API๋ก, ์ ๊ตํ ํ์ดํ๋ผ์ธ์ ์์กดํฉ๋๋ค. ๊ทธ๋ฌ๋ GPU ์์ ์ ๊ณ ์ ํ ๋น๋๊ธฐ์ ํน์ฑ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์๊ณผ ์๊ฐ์ ๊ฒฐํจ์ ์ด๋ํ ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ, ํนํ WebGL Sync Fence๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ๋ ๋๋ง์ ๋ฌ์ฑํ๋ ค๋ ๊ฐ๋ฐ์์๊ฒ ์์ด์๋ ์ ๋ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค.
๋น๋๊ธฐ GPU ์์ ์ ๊ณผ์
๋ณธ์ง์ ์ผ๋ก GPU๋ ๊ทธ๋ํฝ ๋ช ๋ น์ ์์ฒญ๋ ์๋๋ก ์คํํ๋๋ก ์ค๊ณ๋ ๊ณ ๋๋ก ๋ณ๋ ฌ์ ์ธ ์ฒ๋ฆฌ ์ฅ์น์ ๋๋ค. JavaScript ์ฝ๋๊ฐ WebGL์ ๋๋ก์ ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด GPU์์ ์ฆ์ ์คํ๋์ง ์์ต๋๋ค. ๋์ , ์ด ๋ช ๋ น์ ์ผ๋ฐ์ ์ผ๋ก ์ปค๋งจ๋ ๋ฒํผ์ ๋ฐฐ์น๋ ํ GPU๊ฐ ์์ฒด ์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ฌํ ๋น๋๊ธฐ ์คํ์ GPU๊ฐ ๋ ๋๋ง์ผ๋ก ๋ฐ์ ๋์ CPU๊ฐ ๋ค๋ฅธ ์์ ์ ๊ณ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ณธ์ ์ธ ์ค๊ณ ๋ฐฉ์์ ๋๋ค. ์ด๋ ์ ์ตํ์ง๋ง, ์ค์ํ ๊ณผ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค. CPU๋ GPU๊ฐ ํน์ ์์ ์ธํธ๋ฅผ ์๋ฃํ๋์ง ์ด๋ป๊ฒ ์ ์ ์์๊น์?
์ ์ ํ ๋๊ธฐํ๊ฐ ์์ผ๋ฉด CPU๋ ์ด์ GPU ์์ ์ ๊ฒฐ๊ณผ๊ฐ ๋๋๊ธฐ ์ ์ ํด๋น ๊ฒฐ๊ณผ์ ์์กดํ๋ ์๋ก์ด ๋ช ๋ น์ ๋ด๋ฆด ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ค๋๋ ๋ฐ์ดํฐ(Stale Data): CPU๊ฐ GPU๊ฐ ์์ง ์ฐ๊ณ ์๋ ํ ์ค์ฒ๋ ๋ฒํผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ ค๊ณ ํ ์ ์์ต๋๋ค.
- ๋ ๋๋ง ๊ฒฐํจ(Rendering Artifacts): ๋๋ก์ ์์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์์ํ๋์ง ์์ผ๋ฉด ์๊ฐ์ ๊ฒฐํจ, ๋๋ฝ๋ ์์ ๋๋ ์๋ชป๋ ๋ ๋๋ง์ด ๊ด์ฐฐ๋ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ์ ํ(Performance Degradation): CPU๊ฐ ๋ถํ์ํ๊ฒ GPU๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์ง์ฐ๋๊ฑฐ๋, ๋ฐ๋๋ก ๋๋ฌด ๋นจ๋ฆฌ ๋ช ๋ น์ ๋ด๋ ค ๋นํจ์จ์ ์ธ ๋ฆฌ์์ค ํ์ฉ๊ณผ ์ค๋ณต ์์ ์ ์ด๋ํ ์ ์์ต๋๋ค.
- ๊ฒฝ์ ์กฐ๊ฑด(Race Conditions): ์ฌ๋ฌ ๋ ๋๋ง ํจ์ค๋ ์ฌ์ ๋ค๋ฅธ ๋ถ๋ถ ๊ฐ์ ์ํธ ์์กด์ฑ์ ํฌํจํ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ธกํ ์ ์๋ ๋์์ผ๋ก ์ด๋ ค์์ ๊ฒช์ ์ ์์ต๋๋ค.
WebGL Sync Fence ์๊ฐ: ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ
์ด๋ฌํ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด WebGL(๋ฐ ๊ทธ ๊ธฐ๋ฐ์ด ๋๋ OpenGL ES ๋๋ WebGL 2.0 ๋ฑ๊ฐ๋ฌผ)์ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ์ค ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๊ฒ ์ค ํ๋๊ฐ ์ฑํฌ ํ์ค(sync fence)์ ๋๋ค. ์ฑํฌ ํ์ค๋ GPU๋ก ์ ์ก๋๋ ์ปค๋งจ๋ ์คํธ๋ฆผ์ ์ฝ์ ๋ ์ ์๋ ์ ํธ ์ญํ ์ ํฉ๋๋ค. GPU๊ฐ ์คํ ์ค ์ด ํ์ค์ ๋๋ฌํ๋ฉด ํน์ ์กฐ๊ฑด์ ์ ํธ๋ก ๋ณด๋ด CPU๊ฐ ์๋ฆผ์ ๋ฐ๊ฑฐ๋ ์ด ์ ํธ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๊ฒ ํฉ๋๋ค.
์ฑํฌ ํ์ค๋ฅผ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ์ ๋์ธ ๋ง์ปค๋ผ๊ณ ์๊ฐํด๋ณด์ธ์. ๋ฒจํธ ์์ ์์ดํ ์ด ๋ง์ปค์ ๋๋ฌํ๋ฉด ๋ถ์ด ๊น๋ฐ์ ๋๋ค. ํ๋ก์ธ์ค๋ฅผ ๊ฐ๋ ํ๋ ์ฌ๋์ ๋ฒจํธ๋ฅผ ๋ฉ์ถ๊ฑฐ๋, ์กฐ์น๋ฅผ ์ทจํ๊ฑฐ๋, ๋จ์ํ ๋ง์ปค๊ฐ ํต๊ณผํ์์ ์ธ์งํ ์ ์์ต๋๋ค. WebGL์ ๋งฅ๋ฝ์์ '์ปจ๋ฒ ์ด์ด ๋ฒจํธ'๋ GPU์ ์ปค๋งจ๋ ์คํธ๋ฆผ์ด๊ณ , '๋ถ์ด ๊น๋ฐ์ด๋ ๊ฒ'์ ์ฑํฌ ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ฐ๋ ๊ฒ์ ๋๋ค.
Sync Fence์ ํต์ฌ ๊ฐ๋
- ์ฝ์
(Insertion): ์ฑํฌ ํ์ค๋ ์ผ๋ฐ์ ์ผ๋ก
gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0)์ ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ํ WebGL ์ปค๋งจ๋ ์คํธ๋ฆผ์ ์ฝ์ ๋ฉ๋๋ค. ์ด๋ ์ด ํธ์ถ ์ด์ ์ ๋ฐํ๋ ๋ชจ๋ ๋ช ๋ น์ด ์๋ฃ๋๋ฉด GPU๊ฐ ํ์ค์ ์ ํธ๋ฅผ ๋ณด๋ด๋๋ก ์ง์ํฉ๋๋ค. - ์ ํธ(Signaling): GPU๊ฐ ์ด์ ์ ๋ชจ๋ ๋ช ๋ น์ ์ฒ๋ฆฌํ๋ฉด ์ฑํฌ ํ์ค๋ โ์ ํธ๋จ(signaled)โ ์ํ๊ฐ ๋ฉ๋๋ค. ์ด ์ํ๋ ๋๊ธฐํํ๋ ค๋ ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ๋์์์ ๋ํ๋ ๋๋ค.
- ๋๊ธฐ(Waiting): ๊ทธ๋ฐ ๋ค์ CPU๋ ์ฑํฌ ํ์ค์ ์ํ๋ฅผ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค. ์์ง ์ ํธ๋ฅผ ๋ฐ์ง ์์๋ค๋ฉด, CPU๋ ์ ํธ๋ฅผ ๋ฐ์ ๋๊น์ง ๋๊ธฐํ๊ฑฐ๋ ๋ค๋ฅธ ์์ ์ ์ํํ๋ฉฐ ๋์ค์ ์ํ๋ฅผ ํด๋งํ๋๋ก ์ ํํ ์ ์์ต๋๋ค.
- ์ญ์ (Deletion): ์ฑํฌ ํ์ค๋ ๋ฆฌ์์ค์ด๋ฏ๋ก GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๊ธฐ ์ํด ๋ ์ด์ ํ์ํ์ง ์์ ๋
gl.deleteSync(syncFence)๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ์์ ์ผ๋ก ์ญ์ ํด์ผ ํฉ๋๋ค.
WebGL Sync Fence์ ์ค์ ์ ์ฉ ์ฌ๋ก
GPU ์์ ์ ํ์ด๋ฐ์ ์ ๋ฐํ๊ฒ ์ ์ดํ๋ ๋ฅ๋ ฅ์ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๊ธฐ ์ํ ๋ค์ํ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค. ๋ค์์ ์ผ๋ฐ์ ์ด๊ณ ์ํฅ๋ ฅ ์๋ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
1. GPU์์ ํฝ์ ๋ฐ์ดํฐ ์ฝ๊ธฐ
๋๊ธฐํ๊ฐ ์ค์ํ ๊ฐ์ฅ ๋น๋ฒํ ์๋๋ฆฌ์ค ์ค ํ๋๋ GPU์์ CPU๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฝ์ด์ผ ํ ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํ ์ ์์ต๋๋ค.
- ๋ ๋๋ง๋ ํ๋ ์์ ๋ถ์ํ๋ ํ์ฒ๋ฆฌ ํจ๊ณผ ๊ตฌํ.
- ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์คํฌ๋ฆฐ์ท ์บก์ฒ.
- ๋ ๋๋ง๋ ์ฝํ ์ธ ๋ฅผ ํ์ ๋ ๋๋ง ํจ์ค๋ฅผ ์ํ ํ ์ค์ฒ๋ก ์ฌ์ฉ(์ด ๊ฒฝ์ฐ ํ๋ ์๋ฒํผ ๊ฐ์ฒด๊ฐ ์ข ์ข ๋ ํจ์จ์ ์ธ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํจ).
์ผ๋ฐ์ ์ธ ์ํฌํ๋ก์ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฌ์ ํ ์ค์ฒ๋ ํ๋ ์๋ฒํผ์ ์ง์ ๋ ๋๋งํฉ๋๋ค.
- ๋ ๋๋ง ๋ช
๋ น ํ์ ์ฑํฌ ํ์ค๋ฅผ ์ฝ์
ํฉ๋๋ค:
const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0); - ํฝ์
๋ฐ์ดํฐ(์:
gl.readPixels()์ฌ์ฉ)๋ฅผ ์ฝ์ด์ผ ํ ๋, ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ณด๋๋์ง ํ์ธํด์ผ ํฉ๋๋ค.gl.clientWaitSync(sync, 0, gl.TIMEOUT_IGNORED)๋ฅผ ํธ์ถํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค. ์ด ํจ์๋ ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ฐ๊ฑฐ๋ ํ์์์์ด ๋ฐ์ํ ๋๊น์ง CPU ์ค๋ ๋๋ฅผ ์ฐจ๋จํฉ๋๋ค. - ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ฐ์ ํ์๋
gl.readPixels()๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. - ๋ง์ง๋ง์ผ๋ก ์ฑํฌ ํ์ค๋ฅผ ์ญ์ ํฉ๋๋ค:
gl.deleteSync(sync);
๊ธ๋ก๋ฒ ์์: ์ฌ์ฉ์๊ฐ 3D ๋ชจ๋ธ ์์ ์ฃผ์์ ๋ฌ ์ ์๋ ์ค์๊ฐ ํ์ ๋์์ธ ๋๊ตฌ๋ฅผ ์์ํด๋ณด์ธ์. ์ฌ์ฉ์๊ฐ ๋๊ธ์ ์ถ๊ฐํ๊ธฐ ์ํด ๋ ๋๋ง๋ ๋ชจ๋ธ์ ์ผ๋ถ๋ฅผ ์บก์ฒํ๋ ค๋ ๊ฒฝ์ฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ์ฑํฌ ํ์ค๋ ์บก์ฒ๋ ์ด๋ฏธ์ง๊ฐ ๋ ๋๋ง๋ ์ฌ์ ์ ํํ๊ฒ ๋ฐ์ํ๋๋ก ๋ณด์ฅํ์ฌ ๋ถ์์ ํ๊ฑฐ๋ ์์๋ ํ๋ ์์ด ์บก์ฒ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
2. GPU์ CPU ๊ฐ ๋ฐ์ดํฐ ์ ์ก
ํฝ์ ๋ฐ์ดํฐ ์ฝ๊ธฐ๋ฅผ ๋์ด, ์ฑํฌ ํ์ค๋ ์๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋๋ ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ ์ค์ฒ์ ๋ ๋๋งํ ๋ค์ GPU์ ํ์ ๋ ๋๋ง ํจ์ค์์ ํด๋น ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์๋ฒํผ ๊ฐ์ฒด(FBO)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ GPU์ ํ ์ค์ฒ์์ CPU์ ๋ฒํผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ์กํด์ผ ํ๋ ๊ฒฝ์ฐ(์: ๋ณต์กํ ๊ณ์ฐ ๋๋ ๋ค๋ฅธ ๊ณณ์ผ๋ก ๋ณด๋ด๊ธฐ ์ํด) ๋๊ธฐํ๋ ํต์ฌ์ ๋๋ค.
ํจํด์ ์ ์ฌํฉ๋๋ค. GPU ์์
์ ๋ ๋๋งํ๊ฑฐ๋ ์ํํ๊ณ , ํ์ค๋ฅผ ์ฝ์
ํ๊ณ , ํ์ค๋ฅผ ๊ธฐ๋ค๋ฆฐ ๋ค์, ๋ฐ์ดํฐ ์ ์ก(์: gl.readPixels()๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋ฐฐ์ด๋ก ์ฝ๊ธฐ)์ ์์ํฉ๋๋ค.
3. ๋ณต์กํ ๋ ๋๋ง ํ์ดํ๋ผ์ธ ๊ด๋ฆฌ
ํ๋์ 3D ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ํจ์ค๊ฐ ์๋ ๋ณต์กํ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํฌํจํฉ๋๋ค.
- ์ง์ฐ ๋ ๋๋ง(Deferred rendering)
- ๊ทธ๋ฆผ์ ๋งคํ(Shadow mapping)
- ์คํฌ๋ฆฐ ๊ณต๊ฐ ์ฐ๋น์ธํธ ์คํด๋ฃจ์ (SSAO)
- ํ์ฒ๋ฆฌ ํจ๊ณผ(๋ธ๋ฃธ, ์ ๋ณด์ )
์ด๋ฌํ ๊ฐ ํจ์ค๋ ํ์ ํจ์ค์์ ์ฌ์ฉ๋๋ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. ์ ์ ํ ๋๊ธฐํ ์์ด๋ ์ด์ ํจ์ค์์ ์์ง ์ฐ๊ธฐ๊ฐ ์๋ฃ๋์ง ์์ FBO์์ ์ฝ์ผ๋ ค๊ณ ํ ์ ์์ต๋๋ค.
์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ: ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๊ฐ ๋จ๊ณ์์ ๋์ค ๋จ๊ณ์์ ์ฝ์ FBO์ ์ฐ๋ ๊ฒฝ์ฐ, ์ฑํฌ ํ์ค๋ฅผ ์ฝ์ ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ฌ๋ฌ FBO๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ, ํจ์ค ๋ด์ ๋ชจ๋ ๋จ์ผ ๋๋ก์ฐ ์ฝ ํ์ ๋๊ธฐํํ๋ ๋์ ํ FBO์ ์ต์ข ์ถ๋ ฅ๊ณผ ๋ค์ FBO์ ์ ๋ ฅ ์ฌ์ด์์๋ง ๋๊ธฐํํ๋ฉด ๋ ์ ์์ต๋๋ค.
๊ตญ์ ์ ์์: ํญ๊ณต ์ฐ์ฃผ ์์ง๋์ด๊ฐ ์ฌ์ฉํ๋ ๊ฐ์ ํ์ค ํ๋ จ ์๋ฎฌ๋ ์ด์ ์ ๋ณต์กํ ๊ณต๊ธฐ ์ญํ ์๋ฎฌ๋ ์ด์ ์ ๋ ๋๋งํ ์ ์์ต๋๋ค. ๊ฐ ์๋ฎฌ๋ ์ด์ ๋จ๊ณ๋ ์ ์ฒด ์ญํ์ ์๊ฐํํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ ๋๋ง ํจ์ค๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. ์ฑํฌ ํ์ค๋ ์๊ฐํ๊ฐ ๊ฐ ๋จ๊ณ์ ์๋ฎฌ๋ ์ด์ ์ํ๋ฅผ ์ ํํ๊ฒ ๋ฐ์ํ๋๋ก ๋ณด์ฅํ์ฌ ํ๋ จ์์ด ์ผ๊ด์ฑ ์๊ฑฐ๋ ์ค๋๋ ์๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
4. WebAssembly ๋๋ ๋ค๋ฅธ ๋ค์ดํฐ๋ธ ์ฝ๋์์ ์ํธ ์์ฉ
WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ํด WebAssembly(Wasm)๋ฅผ ํ์ฉํ๋ ๊ฒฝ์ฐ, GPU ์์ ์ Wasm ์คํ๊ณผ ๋๊ธฐํํด์ผ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Wasm ๋ชจ๋์ด ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๊ฑฐ๋ ๋ฌผ๋ฆฌ ๊ณ์ฐ์ ์ํํ ํ GPU์ ๊ณต๊ธํ๋ ์ญํ ์ ํ ์ ์์ต๋๋ค. ๋ฐ๋๋ก GPU ๊ณ์ฐ ๊ฒฐ๊ณผ๋ Wasm์์ ์ฒ๋ฆฌํด์ผ ํ ์๋ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์ JavaScript ํ๊ฒฝ(WebGL ๋ช ๋ น ๊ด๋ฆฌ)๊ณผ Wasm ๋ชจ๋ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ํด์ผ ํ ๋, ์ฑํฌ ํ์ค๋ CPU ๋ฐ์ด๋ Wasm์ด๋ GPU์ ์ํด ๋ฐ์ดํฐ๊ฐ ์ ๊ทผ๋๊ธฐ ์ ์ ์ค๋น๋์์์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
5. ๋ค์ํ GPU ์ํคํ ์ฒ ๋ฐ ๋๋ผ์ด๋ฒ์ ๋ํ ์ต์ ํ
GPU ๋๋ผ์ด๋ฒ์ ํ๋์จ์ด์ ๋์์ ์ฌ๋ฌ ์ฅ์น์ ์ด์ ์ฒด์ ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ต๋๋ค. ํ ์ปดํจํฐ์์๋ ์๋ฒฝํ๊ฒ ์๋ํ๋ ๊ฒ์ด ๋ค๋ฅธ ์ปดํจํฐ์์๋ ๋ฏธ๋ฌํ ํ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ฑํฌ ํ์ค๋ ๋๊ธฐํ๋ฅผ ๊ฐ์ ํ๋ ๊ฒฌ๊ณ ํ๊ณ ํ์คํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ฌํ ํ๋ซํผ๋ณ ๋์์ค์ ๋ ํ๋ ฅ์ ์ผ๋ก ๋์ํ ์ ์๊ฒ ํฉ๋๋ค.
`gl.fenceSync` ๋ฐ `gl.clientWaitSync` ์ดํดํ๊ธฐ
์ฑํฌ ํ์ค๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ ๊ด๋ จ๋ ํต์ฌ WebGL ํจ์์ ๋ํด ๋ ๊น์ด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
`gl.fenceSync(condition, flags)`
condition: ์ด ๋งค๊ฐ๋ณ์๋ ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ฐ์์ผ ํ๋ ์กฐ๊ฑด์ ์ง์ ํฉ๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์gl.SYNC_GPU_COMMANDS_COMPLETE์ ๋๋ค. ์ด ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด,gl.fenceSyncํธ์ถ ์ ์ GPU์ ๋ฐํ๋ ๋ชจ๋ ๋ช ๋ น์ด ์คํ์ ์๋ฃํ์์ ์๋ฏธํฉ๋๋ค.flags: ์ด ๋งค๊ฐ๋ณ์๋ ์ถ๊ฐ ๋์์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.gl.SYNC_GPU_COMMANDS_COMPLETE์ ๊ฒฝ์ฐ, ํ๋๊ทธ๋ ์ผ๋ฐ์ ์ผ๋ก0์ ์ฌ์ฉํ๋ฉฐ, ํ์ค ์๋ฃ ์ ํธ ์ธ์ ํน๋ณํ ๋์์ด ์์์ ๋ํ๋ ๋๋ค.
์ด ํจ์๋ ํ์ค๋ฅผ ๋ํ๋ด๋ WebGLSync ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด(์: ์ ํจํ์ง ์์ ๋งค๊ฐ๋ณ์, ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ) null์ ๋ฐํํฉ๋๋ค.
`gl.clientWaitSync(sync, flags, timeout)`
์ด๊ฒ์ CPU๊ฐ ์ฑํฌ ํ์ค์ ์ํ๋ฅผ ํ์ธํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ์ ํธ๋ฅผ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ฐ ์ฌ์ฉํ๋ ํจ์์ ๋๋ค. ๋ช ๊ฐ์ง ์ค์ํ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
sync:gl.fenceSync๊ฐ ๋ฐํํWebGLSync๊ฐ์ฒด์ ๋๋ค.flags: ๋๊ธฐ ๋์์ ์ ์ดํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:0: ํ์ค ์ํ๋ฅผ ํด๋งํฉ๋๋ค. ์ ํธ๊ฐ ์์ผ๋ฉด ํจ์๋ ์ฆ์ ์ ํธ๊ฐ ์์ง ์์์ ๋ํ๋ด๋ ์ํ๋ก ๋ฐํ๋ฉ๋๋ค.gl.SYNC_FLUSH_COMMANDS_BIT: ํ์ค์ ์์ง ์ ํธ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ด ํ๋๊ทธ๋ ๋๊ธฐ๋ฅผ ๊ณ์ํ๊ธฐ ์ ์ GPU์ ๋ณด๋ฅ ์ค์ธ ๋ชจ๋ ๋ช ๋ น์ ํ๋ฌ์ํ๋๋ก ์ง์ํฉ๋๋ค.
timeout: CPU ์ค๋ ๋๊ฐ ํ์ค ์ ํธ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ ์๊ฐ์ ์ง์ ํฉ๋๋ค.gl.TIMEOUT_IGNORED: CPU ์ค๋ ๋๋ ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ฐ์ ๋๊น์ง ๋ฌด๊ธฐํ ๋๊ธฐํฉ๋๋ค. ์ด๋ ์งํํ๊ธฐ ์ ์ ์์ ์ด ๋ฐ๋์ ์๋ฃ๋์ด์ผ ํ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.- ์์ ์ ์: ๋๋ ธ์ด ๋จ์์ ํ์์์์ ๋ํ๋ ๋๋ค. ํจ์๋ ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ฐ๊ฑฐ๋ ์ง์ ๋ ์๊ฐ์ด ๊ฒฝ๊ณผํ๋ฉด ๋ฐํ๋ฉ๋๋ค.
gl.clientWaitSync์ ๋ฐํ ๊ฐ์ ํ์ค์ ์ํ๋ฅผ ๋ํ๋
๋๋ค.
gl.ALREADY_SIGNALED: ํจ์๊ฐ ํธ์ถ๋์์ ๋ ํ์ค๊ฐ ์ด๋ฏธ ์ ํธ๋ฅผ ๋ฐ์ ์ํ์์ต๋๋ค.gl.TIMEOUT_EXPIRED: ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ฐ๊ธฐ ์ ์timeout๋งค๊ฐ๋ณ์๋ก ์ง์ ๋ ์๊ฐ์ด ๊ฒฝ๊ณผํ์ต๋๋ค.gl.CONDITION_SATISFIED: ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ฐ์๊ณ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์์ต๋๋ค(์: GPU ๋ช ๋ น ์๋ฃ).gl.WAIT_FAILED: ๋๊ธฐ ์์ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค(์: ์ฑํฌ ๊ฐ์ฒด๊ฐ ์ญ์ ๋์๊ฑฐ๋ ์ ํจํ์ง ์์).
`gl.deleteSync(sync)`
์ด ํจ์๋ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฑํฌ ํ์ค๊ฐ ์ฌ์ฉ๋์๊ณ ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฉด ๊ด๋ จ GPU ๋ฆฌ์์ค๋ฅผ ํด์ ํ๊ธฐ ์ํด ์ญ์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ณ ๊ธ ๋๊ธฐํ ํจํด ๋ฐ ๊ณ ๋ ค ์ฌํญ
`gl.SYNC_GPU_COMMANDS_COMPLETE`๊ฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์กฐ๊ฑด์ด์ง๋ง, WebGL 2.0(๋ฐ ๊ธฐ๋ฐ์ด ๋๋ OpenGL ES 3.0 ์ด์)์ ๋ ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
`gl.SYNC_FENCE`์ `gl.CONDITION_MAX`
WebGL 2.0์ `gl.fenceSync`์ ์กฐ๊ฑด์ผ๋ก `gl.SYNC_FENCE`๋ฅผ ๋์ ํฉ๋๋ค. ์ด ์กฐ๊ฑด์ด ์๋ ํ์ค๊ฐ ์ ํธ๋ฅผ ๋ณด๋ด๋ฉด GPU๊ฐ ํด๋น ์ง์ ์ ๋๋ฌํ๋ค๋ ๋ ๊ฐ๋ ฅํ ๋ณด์ฅ์ด ๋ฉ๋๋ค. ์ด๋ ์ข ์ข ํน์ ๋๊ธฐํ ๊ฐ์ฒด์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
`gl.waitSync` ๋ `gl.clientWaitSync`
`gl.clientWaitSync`๋ JavaScript ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ ์ ์๋ ๋ฐ๋ฉด, `gl.waitSync`(์ผ๋ถ ์ปจํ ์คํธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ข ์ข ๋ธ๋ผ์ฐ์ ์ WebGL ๊ณ์ธต์์ ๊ตฌํ๋จ)๋ ๋๊ธฐ ์ค์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ณดํ๊ฑฐ๋ ๋ค๋ฅธ ์์ ์ ์ํํ๋๋ก ํ์ฉํจ์ผ๋ก์จ ๋ ์ ๊ตํ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์ ํ์ค WebGL์ ๊ฒฝ์ฐ, `gl.clientWaitSync`๊ฐ CPU ์ธก ๋๊ธฐ๋ฅผ ์ํ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
CPU-GPU ์ํธ ์์ฉ: ๋ณ๋ชฉ ํ์ ํผํ๊ธฐ
๋๊ธฐํ์ ๋ชฉํ๋ CPU๊ฐ ๋ถํ์ํ๊ฒ GPU๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ ๊ฒ์ด ์๋๋ผ, CPU๊ฐ GPU์ ์์ ์ ์ฌ์ฉํ๊ฑฐ๋ ์์กดํ๊ธฐ ์ ์ GPU๊ฐ ์์ ์ ์๋ฃํ์์ ๋ณด์ฅํ๋ ๊ฒ์ ๋๋ค. `gl.TIMEOUT_IGNORED`์ ํจ๊ป `gl.clientWaitSync`๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด GPU ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ง๋ ฌ ์คํ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ณํ์ฌ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ด์ ์ ๋ฌดํจํํ ์ ์์ต๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก: ๊ฐ๋ฅํ๋ฉด CPU๊ฐ GPU๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ๋ ๋ฆฝ์ ์ธ ์์ ์ ๊ณ์ ์ํํ ์ ์๋๋ก ๋ ๋๋ง ๋ฃจํ๋ฅผ ๊ตฌ์ฑํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๋ ๋๋ง ํจ์ค๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ CPU๋ ๋ค์ ํ๋ ์์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๊ฑฐ๋ ๊ฒ์ ๋ก์ง์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ๊ด์ฐฐ: ์ ์ฌ์ GPU๋ ํตํฉ ๊ทธ๋ํฝ์ด ํ์ฌ๋ ์ฅ์น๋ GPU ์์ ์ ๋ ๋์ ์ง์ฐ ์๊ฐ์ด ์์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ํ๋ซํผ์์๋ ๋๊น ํ์์ ๋ฐฉ์งํ๊ณ ์ ์ธ๊ณ์ ๋ค์ํ ํ๋์จ์ด์์ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํด ํ์ค๋ฅผ ์ฌ์ฉํ ์ ์คํ ๋๊ธฐํ๊ฐ ๋์ฑ ์ค์ํด์ง๋๋ค.
ํ๋ ์๋ฒํผ ๋ฐ ํ ์ค์ฒ ํ๊ฒ
WebGL 2.0์์ ํ๋ ์๋ฒํผ ๊ฐ์ฒด(FBO)๋ฅผ ์ฌ์ฉํ ๋, ๋ชจ๋ ์ ํ์ ๋ช ์์ ์ธ ์ฑํฌ ํ์ค๊ฐ ํ์ ์์ด ๋ ๋๋ง ํจ์ค ๊ฐ์ ๋๊ธฐํ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๋ฌ์ฑํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์๋ฅผ ๋ค์ด, FBO A์ ๋ ๋๋งํ ๋ค์ ์ฆ์ ํด๋น ์ปฌ๋ฌ ๋ฒํผ๋ฅผ FBO B์ ๋ ๋๋งํ๊ธฐ ์ํ ํ ์ค์ฒ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, WebGL ๊ตฌํ์ ์ข ์ข ์ด ์ข ์์ฑ์ ๋ด๋ถ์ ์ผ๋ก ๊ด๋ฆฌํ ๋งํผ ๋๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ FBO B์ ๋ ๋๋งํ๊ธฐ ์ ์ FBO A์์ CPU๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฝ์ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ฑํฌ ํ์ค๊ฐ ํ์ํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋๋ฒ๊น
๋๊ธฐํ ๋ฌธ์ ๋ ๋๋ฒ๊น ํ๊ธฐ ๋งค์ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ฒฝ์ ์กฐ๊ฑด์ ์ข ์ข ์ฐ๋ฐ์ ์ผ๋ก ๋ํ๋ ์ฌํํ๊ธฐ ์ด๋ ต์ต๋๋ค.
gl.getError()๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์ธ์: WebGL ํธ์ถ ํ์๋ ํญ์ ์ค๋ฅ๋ฅผ ํ์ธํ์ญ์์ค.- ๋ฌธ์ ์ฝ๋๋ฅผ ๊ฒฉ๋ฆฌํ์ธ์: ๋๊ธฐํ ๋ฌธ์ ๊ฐ ์์ฌ๋๋ฉด ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ด๋ ๋ฐ์ดํฐ ์ ์ก ์์ ์ ์ผ๋ถ๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํ์ฌ ์์ธ์ ์ฐพ์๋ณด์ญ์์ค.
- ํ์ดํ๋ผ์ธ์ ์๊ฐํํ์ธ์: ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(์: Chrome์ WebGL์ฉ DevTools ๋๋ ์ธ๋ถ ํ๋กํ์ผ๋ฌ)๋ฅผ ์ฌ์ฉํ์ฌ GPU ์ปค๋งจ๋ ํ๋ฅผ ๊ฒ์ฌํ๊ณ ์คํ ํ๋ฆ์ ์ดํดํ์ญ์์ค.
- ๋จ์ํ๊ฒ ์์ํ์ธ์: ๋ณต์กํ ๋๊ธฐํ๋ฅผ ๊ตฌํํ๋ ๊ฒฝ์ฐ, ๊ฐ์ฅ ๊ฐ๋จํ ์๋๋ฆฌ์ค์์ ์์ํ์ฌ ์ ์ฐจ ๋ณต์ก์ฑ์ ์ถ๊ฐํ์ญ์์ค.
๊ธ๋ก๋ฒ ํต์ฐฐ๋ ฅ: ๋ค์ํ ๋ธ๋ผ์ฐ์ (Chrome, Firefox, Safari, Edge)์ ์ด์ ์ฒด์ (Windows, macOS, Linux, Android, iOS)์์ ๋๋ฒ๊น ํ๋ ๊ฒ์ WebGL ๊ตฌํ ๋ฐ ๋๋ผ์ด๋ฒ ๋์์ด ๋ค์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ฑํฌ ํ์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ฉด ์ด ๊ธ๋ก๋ฒ ์คํํธ๋ผ ์ ๋ฐ์ ๊ฑธ์ณ ๋ ์ผ๊ด๋๊ฒ ์๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค.
๋์ ๋ฐ ๋ณด์ ๊ธฐ์
์ฑํฌ ํ์ค๋ ๊ฐ๋ ฅํ์ง๋ง ๋๊ธฐํ ๋๊ตฌ ์์์ ์ ์ผํ ๋๊ตฌ๋ ์๋๋๋ค.
- ํ๋ ์๋ฒํผ ๊ฐ์ฒด(FBO): ์์ ์ธ๊ธํ๋ฏ์ด FBO๋ ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ ๋ค์ค ํจ์ค ๋ ๋๋ง์ ๊ธฐ๋ณธ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ตฌํ์ ์ข ์ข FBO์ ๋ ๋๋งํ๋ ๊ฒ๊ณผ ๋ค์ ๋จ๊ณ์์ ์ด๋ฅผ ํ ์ค์ฒ๋ก ์ฌ์ฉํ๋ ๊ฒ ์ฌ์ด์ ์ข ์์ฑ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋น๋๊ธฐ ์ ฐ์ด๋ ์ปดํ์ผ: ์ ฐ์ด๋ ์ปดํ์ผ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ํ๋ก์ธ์ค์ผ ์ ์์ต๋๋ค. WebGL 2.0์ ๋น๋๊ธฐ ์ปดํ์ผ์ ํ์ฉํ๋ฏ๋ก ์ ฐ์ด๋๊ฐ ์ฒ๋ฆฌ๋๋ ๋์ ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ฉ์ถ์ง ์์๋ ๋ฉ๋๋ค.
requestAnimationFrame: ์ด๊ฒ์ ๋ ๋๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ค์ผ์ค๋งํ๋ ํ์ค ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ ๋ฆฌํ์ธํธ๋ฅผ ์ํํ๊ธฐ ์ง์ ์ ๋ ๋๋ง ์ฝ๋๊ฐ ์คํ๋๋๋ก ๋ณด์ฅํ์ฌ ๋ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ๊ณผ ๋ ๋์ ์ ๋ ฅ ํจ์จ์ฑ์ ์ ๊ณตํฉ๋๋ค.- ์น ์์ปค(Web Workers): GPU ์์ ๊ณผ ๋๊ธฐํํด์ผ ํ๋ ๋ฌด๊ฑฐ์ด CPU ๋ฐ์ด๋ ๊ณ์ฐ์ ๊ฒฝ์ฐ, ์น ์์ปค๋ ๋ฉ์ธ ์ค๋ ๋์์ ์์ ์ ์คํ๋ก๋ํ ์ ์์ต๋๋ค. ๋ฉ์ธ ์ค๋ ๋(WebGL ๊ด๋ฆฌ)์ ์น ์์ปค ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ ๋๊ธฐํ๋ ์ ์์ต๋๋ค.
์ฑํฌ ํ์ค๋ ์ข
์ข
์ด๋ฌํ ๊ธฐ์ ๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, requestAnimationFrame์ ์ฌ์ฉํ์ฌ ๋ ๋๋ง ๋ฃจํ๋ฅผ ๊ตฌ๋ํ๊ณ , ์น ์์ปค์์ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ ๋ค์, ์ฑํฌ ํ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฑฐ๋ ์๋ก์ด ์ข
์ ์์
์ ์์ํ๊ธฐ ์ ์ GPU ์์
์ด ์๋ฃ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์น์์์ GPU-CPU ๋๊ธฐํ์ ๋ฏธ๋
์น ๊ทธ๋ํฝ์ด ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ ๋์ ์ถฉ์ค๋์ ๋ํ ์๊ตฌ์ ํจ๊ป ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ํจ์จ์ ์ธ ๋๊ธฐํ๋ ๊ณ์ํด์ ์ค์ํ ์์ญ์ผ๋ก ๋จ์ ๊ฒ์ ๋๋ค. WebGL 2.0์ ๋๊ธฐํ ๊ธฐ๋ฅ์ ํฌ๊ฒ ํฅ์์์ผฐ์ผ๋ฉฐ, WebGPU์ ๊ฐ์ ๋ฏธ๋์ ์น ๊ทธ๋ํฝ API๋ GPU ์์ ์ ๋ํ ํจ์ฌ ๋ ์ง์ ์ ์ด๊ณ ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ ๊ณตํ์ฌ ์ ์ฌ์ ์ผ๋ก ๋ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ๋ช ์์ ์ธ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. WebGL ์ฑํฌ ํ์ค ์ด๋ฉด์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ด๋ฌํ ๋ฏธ๋ ๊ธฐ์ ์ ๋ง์คํฐํ๊ธฐ ์ํ ๊ท์คํ ๊ธฐ๋ฐ์ ๋๋ค.
๊ฒฐ๋ก
WebGL Sync Fence๋ ์น ๊ทธ๋ํฝ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฒฌ๊ณ ํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ GPU-CPU ๋๊ธฐํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ํ์์ ์ธ ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋๋ค. ๊ฐ๋ฐ์๋ ์ฑํฌ ํ์ค๋ฅผ ์ ์คํ๊ฒ ์ฝ์ ํ๊ณ ๊ธฐ๋ค๋ฆผ์ผ๋ก์จ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๊ณ , ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ํผํ๋ฉฐ, ๋ณต์กํ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ด ์ ํํ๊ณ ํจ์จ์ ์ผ๋ก ์คํ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ๋ถํ์ํ ์ง์ฐ์ ๋์ ํ์ง ์๊ธฐ ์ํด ์ฌ๋ ค ๊น์ ๊ตฌํ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํ์ง๋ง, ์ด๋ค์ด ์ ๊ณตํ๋ ์ ์ด๋ ๊ณ ํ์ง์ ํฌ๋ก์ค ํ๋ซํผ WebGL ๊ฒฝํ์ ๊ตฌ์ถํ๋ ๋ฐ ์์ด์๋ ์ ๋ ํ์ ์์์ ๋๋ค. ์ด๋ฌํ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๋ง์คํฐํ๋ฉด ์น ๊ทธ๋ํฝ์ผ๋ก ๊ฐ๋ฅํ ๊ฒ์ ๊ฒฝ๊ณ๋ฅผ ๋ํ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๋ฉฐ ์๊ฐ์ ์ผ๋ก ๋๋ผ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
ํต์ฌ ์์ฝ:
- GPU ์์ ์ ๋น๋๊ธฐ์ ์ด๋ฏ๋ก ๋๊ธฐํ๊ฐ ํ์ํฉ๋๋ค.
- WebGL Sync Fence(์:
gl.SYNC_GPU_COMMANDS_COMPLETE)๋ CPU์ GPU ๊ฐ์ ์ ํธ ์ญํ ์ ํฉ๋๋ค. gl.fenceSync๋ฅผ ์ฌ์ฉํ์ฌ ํ์ค๋ฅผ ์ฝ์ ํ๊ณgl.clientWaitSync๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ค๋ฆฝ๋๋ค.- ํฝ์ ๋ฐ์ดํฐ ์ฝ๊ธฐ, ๋ฐ์ดํฐ ์ ์ก ๋ฐ ๋ณต์กํ ๋ ๋๋ง ํ์ดํ๋ผ์ธ ๊ด๋ฆฌ์ ํ์์ ์ ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํญ์
gl.deleteSync๋ฅผ ์ฌ์ฉํ์ฌ ์ฑํฌ ํ์ค๋ฅผ ์ญ์ ํ์ญ์์ค. - ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ํผํ๊ธฐ ์ํด ๋๊ธฐํ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ๊ท ํ์ ๋ง์ถ์ญ์์ค.
์ด๋ฌํ ๊ฐ๋ ์ WebGL ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ํตํฉํจ์ผ๋ก์จ ๊ทธ๋ํฝ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์์ผ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ฐ์ํ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.